package br.com.rglariguet.pioneer.controller.asc;

import java.util.Arrays;
import java.util.Calendar;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import br.com.rglariguet.pioneer.controller.ControllerComum;
import br.com.rglariguet.pioneer.dao.PecaDAO;
import br.com.rglariguet.pioneer.dao.PedidoDAO;
import br.com.rglariguet.pioneer.dao.PedidoPecaDAO;
import br.com.rglariguet.pioneer.enums.SituacaoPedidoPecaEnum;
import br.com.rglariguet.pioneer.filtropesquisa.FiltroPedidoPeca;
import br.com.rglariguet.pioneer.modelos.Pedido;
import br.com.rglariguet.pioneer.modelos.PedidoPeca;
import br.com.rglariguet.pioneer.util.MensagemTela;
import br.com.rglariguet.pioneer.util.PecaUtil;
import br.com.rglariguet.pioneer.wrapper.ListaPedidosPecasWrapper;

@Controller
@RequestMapping("/seguro/asc/")
public class PedidoPecaController extends ControllerComum {

	@Autowired
	private PecaDAO pecaDao;

	@Autowired
	PedidoPecaDAO pedidoPecaDao;

	@Autowired
	private PedidoDAO pedidoDao;

	private Pedido pedido = new Pedido();

	@RequestMapping("gravarPedido")
	public ModelAndView gravaPedido() {

		for (PedidoPeca pedidoPeca : getPedido().getPedidosPeca()) {
			pedidoPecaDao.salvar(pedidoPeca);
		}
		getPedido().setDataDoPedido(Calendar.getInstance());
		Pedido pedidoSalvo = pedidoDao.salvar(getPedido());
		pedidoSalvo.setNumeroPedido(String.valueOf(pedidoSalvo.getId()));
		pedidoDao.alterar(pedido);
		return abreTelaPedidoPecasOW(false, criaMsgSucesso("pedido.realizado.sucesso"));
	}

	@RequestMapping("adicionaPecaAoPedido")
	public ModelAndView adicionaPeca(@Valid PedidoPeca pedidoPeca, BindingResult br) {
		ModelAndView mv = new ModelAndView("/seguro/asc/pedidoPecasOW");
		if (br.hasFieldErrors("peca.codigo") || br.hasFieldErrors("quantidade")) {
			return abreTelaPedidoPecasOW(true, criaMsgErro("inclusao.peca.erro"));
		}

		if (!PecaUtil.validaPecaComTraco(pedidoPeca.getPeca().getCodigo())) {
			return abreTelaPedidoPecasOW(true, criaMsgErro("peca.nao.encontrada"));
		}
		
		
		if (!PecaUtil.pecaExiste(pedidoPeca.getPeca().getCodigo(), pecaDao)) {
			return abreTelaPedidoPecasOW(true, criaMsgErro("peca.nao.encontrada"));
		}
		
		pedidoPeca.setPeca(pecaDao.buscaPorCodigo(pedidoPeca.getPeca().getCodigo().split(" - ")[0]));

		
		pedidoPeca.setPeca(pecaDao.buscaPorCodigo(pedidoPeca.getPeca().getCodigo()));

		boolean existeNaLista = false;
		for (PedidoPeca pedidoPecaDaLista : getPedido().getPedidosPeca()) {
			if (pedidoPecaDaLista.getPeca().getCodigo().equals(pedidoPeca.getPeca().getCodigo())) {
				pedidoPecaDaLista.setQuantidade(pedidoPecaDaLista.getQuantidade() + pedidoPeca.getQuantidade());
				existeNaLista = true;
			}
		}
		if (!existeNaLista) {
			PedidoPeca pedidoPecaNovo = new PedidoPeca();
			pedidoPecaNovo.setPeca(pedidoPeca.getPeca());
			pedidoPecaNovo.setStatus(SituacaoPedidoPecaEnum.PENDENTE);
			pedidoPecaNovo.setQuantidade(pedidoPeca.getQuantidade());
			getPedido().getPedidosPeca().add(pedidoPecaNovo);
		}
		mv.addObject("pedidoPeca", new PedidoPeca());
		mv.addObject("pedido", getPedido());
		return mv;
	}

	@ModelAttribute("pedido")
	public Pedido getPedido() {
		return this.pedido;
	}

	public void setPedido(Pedido pedido) {
		this.pedido = pedido;
	}

	@RequestMapping("pedidoPecasOW")
	public ModelAndView abreTelaPedidoPecasOW(boolean isRetornoConsulta, MensagemTela msg) {
		ModelAndView mv = new ModelAndView("/seguro/asc/pedidoPecasOW");
		mv.addObject("msg", msg.getTipoMensagem() != null ? msg : null);
		if (!isRetornoConsulta) {
			mv.addObject("pedidoPeca", new PedidoPeca());
			mv.addObject("pedido", new Pedido());
			setPedido(new Pedido());
		}
		return mv;
	}

	@RequestMapping("consultaDePedidos")
	public ModelAndView abreTelaConsultaDePedidos() {
		ModelAndView mv = new ModelAndView("/seguro/asc/consultaDePedidos");
		mv.addObject("status", Arrays.asList(SituacaoPedidoPecaEnum.values()));
		mv.addObject("filtroPedidoPeca", new FiltroPedidoPeca());
		return mv;
	}

	@RequestMapping("consultaPedidosPecas")
	public ModelAndView consultaPedidosPecas(FiltroPedidoPeca filtroPedidoPeca) {
		ModelAndView mv = new ModelAndView("/seguro/asc/consultaDePedidos");

		ListaPedidosPecasWrapper pedidoWrapper = new ListaPedidosPecasWrapper();
		pedidoWrapper.setPedidos(pedidoDao.listarComFiltro(filtroPedidoPeca));
		mv.addObject("pedidos", pedidoWrapper.getPedidos());

		mv.addObject("status", Arrays.asList(SituacaoPedidoPecaEnum.values()));

		return mv;
	}
}
